/*!
 * middleware.ts
 * 注意：middleware 可能被 vercel 抽离部署在边缘计算平台，因此只能使用 Edge Runtime API
 */
import 'server-only';
import { cookies } from 'next/headers';
import { NextRequest, NextResponse } from 'next/server';
import { protectedApiRegExps, protectedRoutesRegExps } from './authPatterns';

export async function authMiddleware(request: NextRequest) {
  const { pathname, search } = request.nextUrl;
  const isProtectedApi = protectedApiRegExps.some((pattern) => pattern.test(pathname));
  const isProtectedRoute = protectedRoutesRegExps.some((pattern) => pattern.test(pathname));

  // 中间件阶段使用乐观检查：使用 cookie 加快检测速度，只要有 token 就通过认证，真实登录状态需要在落地页验证
  const cookiesStore = await cookies();
  const token = cookiesStore.get('token')?.value;

  // 受保护接口：采用乐观验证，没有 token 不能访问，具体是否登录在接口中验证
  if (isProtectedApi && !token) {
    // 401 Unauthorized
    return NextResponse.json({ message: 'Unauthorized' }, { status: 401 });
  }

  // 受保护路由：采用乐观验证，只要有 token 就通过认证，真实登录状态需要在落地页验证
  if (isProtectedRoute && !token) {
    const searchParams = new URLSearchParams();
    searchParams.set('redirect', `${pathname}${search}`);
    return NextResponse.redirect(new URL(`/login?${searchParams.toString()}`, request.url));
  }

  return NextResponse.next();
}
